class AudioProcessor extends AudioWorkletProcessor {
    constructor() {
        super();
        this.buffer = new Float32Array(0); // 初始为空的 Float32Array
        this.frameLimit = 48000 / (1000/1500); // 每 100ms 合并一次（假设采样率为 16kHz）
        this.silenceThreshold = 0.01; // 静默检测阈值，音频 RMS 值小于此值认为是静默
    }

    /**
     * 检测音频块是否为静默
     * @param {Float32Array} data 音频数据
     * @returns {boolean} 是否为静默
     */
    isSilent(data) {
        const rms = Math.sqrt(data.reduce((sum, value) => sum + value ** 2, 0) / data.length);
        return rms < this.silenceThreshold;
    }

    /**
     * 合并新的音频块到缓冲区
     * @param {Float32Array} newData 新的音频数据
     */
    appendToBuffer(newData) {
        const currentLength = this.buffer.length;
        const newLength = currentLength + newData.length;
        const mergedBuffer = new Float32Array(newLength); // 创建新的 Float32Array
        mergedBuffer.set(this.buffer, 0); // 复制现有数据到新缓冲区
        mergedBuffer.set(newData, currentLength); // 添加新数据到缓冲区
        this.buffer = mergedBuffer; // 替换旧缓冲区
    }

    process(inputs, outputs) {
        const input = inputs[0];
        if (input && input.length > 0) {
            const channelData = input[0];
            // 将音频块合并到缓冲区
            this.appendToBuffer(channelData);
            /*// 检测静默帧（可选）
            if (this.isSilent(channelData)) {
                return true; // 不发送静默数据
            }*/
            // 如果缓冲区长度超过限制，则发送音频数据
            if (this.buffer.length >= this.frameLimit) {
                this.port.postMessage(this.buffer); // 发送数据到主线程
                this.buffer = new Float32Array(0); // 清空缓冲区
            }
        }
        return true; // 返回 true 表示继续处理音频
    }
}

// 注册 AudioProcessor
registerProcessor("audio-processor", AudioProcessor);
